package com.demo.order.controller;

import com.demo.common.base.pojo.JsonRes;
import com.demo.common.ratelimit.annotation.ApiIdempotent;
import com.demo.common.ratelimit.annotation.ApiRateLimiter;
import com.demo.common.ratelimit.annotation.DistributeLock;
import com.demo.common.ratelimit.utils.SleepUtil;
import lombok.Data;
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;


/**
 * 限流样例
 *
 * @author DayDayUp
 * @datetime 2023-09-04 9:01
 **/
@Slf4j
@RestController
@RequestMapping("/rate-limiter")
public class RateLimiterController {

    /**
     * 幂等性样例（默认），先去掉限流，避免受到影响
     * @return String
     */
    @ApiIdempotent
    @ApiRateLimiter(limit = false)
    @GetMapping(value = "/apiIdempotent-default")
    public JsonRes<String> apiIdempotentDefault() {
        return JsonRes.ok("幂等性样例-默认");
    }

    /**
     * 幂等性样例（自定义，支持spel表达式）
     * @return String
     */
    @ApiIdempotent(extra = "#username")
    @ApiRateLimiter(limit = false)
    @GetMapping(value = "/apiIdempotent-custom")
    public JsonRes<String> apiIdempotentCustom(String username) {
        return JsonRes.ok("幂等性样例-自定义");
    }

    /**
     * 限流样例（默认）
     * @return String
     */
    @ApiRateLimiter
    @GetMapping(value = "/apiRateLimiter-default")
    public JsonRes<String> apiRateLimiterDefault() {
        return JsonRes.ok("限流样例-默认");
    }

    /**
     * 限流样例（默认，不加注解一样会限流，效果一样）
     * @return String
     */
    @GetMapping(value = "/apiRateLimiter")
    public JsonRes<String> apiRateLimiter() {
        return JsonRes.ok("限流样例-默认");
    }


    /**
     * 限流样例（自定义）
     * @return String
     */
    @ApiRateLimiter(time = 1,count = 1)
    @GetMapping(value = "/apiRateLimiter-custom")
    public JsonRes<String> apiRateLimiterCustom() {
        return JsonRes.ok("限流样例-自定义");
    }

    /**
     * 限流样例（自定义，针对接口不作限流）
     * @return String
     */
    @ApiRateLimiter(limit = false)
    @GetMapping(value = "/apiRateLimiter-unlimit")
    public JsonRes<String> apiRateLimiterUnLimit() {
        return JsonRes.ok("限流样例-不限流");
    }


    /**
     * 分布式锁样例（默认）
     * @return String
     */
    @DistributeLock
    @GetMapping(value = "/distributeLock-default")
    public JsonRes<String> distributeLockDefault() {
        SleepUtil.sleep(10000);
        return JsonRes.ok("分布式锁样例-默认");
    }

    /**
     * 分布式锁样例（自定义，支持spel表达式）
     * @return String
     */
    @DistributeLock(waitTime = 10,suffixKey = "#userBO.username")
    @GetMapping(value = "/distributeLock-custom")
    public JsonRes<String> distributeLockCustom(UserBO userBO) {
        SleepUtil.sleep(10000);
        return JsonRes.ok("分布式锁样例-自定义");
    }

    @Data
    public static class UserBO{
        private String username;
    }
}
